home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0693 / VGADEMO.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-30  |  4KB  |  143 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 268 of 465
  3. From : Sean Palmer                         1:104/123.0          21 Jun 93  00:37
  4. To   : Brian Pape
  5. Subj : BSplines/Heat Seekers
  6. ────────────────────────────────────────────────────────────────────────────────
  7. BP>SP>What about the B-Spline routine?
  8.  
  9. BP>It was very good.
  10.  
  11. I've been playing around with it as a way to make 'heat-seeking
  12. missiles' in games. Very interesting...
  13.  
  14. What I do is have the points set up as follows:
  15.  
  16. 1:current position
  17. 2&3:current speed + the current position
  18. 4:destination
  19.  
  20. and update current position by indexing somewhere into the curve (like
  21. at $100 out of $FFFF
  22.  
  23. This works very well. Problem is that I don't know of a good way to
  24. change the speed.
  25.  
  26. Here is a simple demo that makes a dot chase the mouse cursor (needs
  27. VGA as written) that shows what I mean.
  28.  
  29. If ANYBODY can make this work smoother or improve on it in any way I
  30. would appreciate being told how... 8)}
  31.  
  32. uses mouse,crt;  {you will need to change accesses to the mouse unit}
  33.                  {to use a mouse package that you provide}
  34.  
  35. var color:byte;
  36. procedure plot(x,y:word);begin
  37.  mem[$A000:y*320+x]:=color;
  38.  end;
  39.  
  40. type
  41.  coord=record x,y:word; end;
  42.  CurveDataRec=array[0..65521 div sizeof(coord)]of coord;
  43.  
  44. function fracMul(f,f2:word):word;Inline(
  45.   $58/                   {pop ax}
  46.   $5B/                   {pop bx}
  47.   $F7/$E3/               {mul bx}
  48.   $89/$D0);              {mov ax,dx}
  49.  
  50. function mul(f,f2:word):longint;inline(
  51.   $58/                   {pop ax}
  52.   $5B/                   {pop bx}
  53.   $F7/$E3);              {mul bx}
  54.  
  55.  
  56. const nSteps=1 shl 8;  {about 8 for smoothness (dots), 4 for speed (lines)}
  57.  
  58. {this is the original full BSpline routine}
  59.  
  60. procedure drawBSpline(var d0:coord;nPoints:word);
  61.  const nsa=$10000 div 6; nsb=$20000 div 3;
  62.  const step=$10000 div nSteps;
  63.  var
  64.   i,xx,yy:word;
  65.   t1,t2,t3:word;
  66.   c1,c2,c3,c4:word;
  67.   d:curveDataRec absolute d0;
  68. begin
  69.  t1:=0; color:=32+2;
  70.  for i:=0 to nPoints-4 do begin
  71.  
  72. {algorithm converted from Steve Enns' original Basic subroutine}
  73.  
  74.   repeat
  75.    t2:=fracMul(t1,t1); t3:=fracMul(t2,t1);
  76.    c1:=(integer(t2-t1)div 2)+nsa-fracmul(nsa,t3);
  77.    c2:=(t3 shr 1)+nsb-t2;
  78.    c3:=((t2+t1-t3)shr 1)+nsa;
  79.    c4:=fracmul(nsa,t3);
  80.    xx:=(mul(c1,d[i].x)+mul(c2,d[i+1].x)
  81.        +mul(c3,d[i+2].x)+mul(c4,d[i+3].x))shr 16;
  82.    yy:=(mul(c1,d[i].y)+mul(c2,d[i+1].y)
  83.        +mul(c3,d[i+2].y)+mul(c4,d[i+3].y))shr 16;
  84.    plot(xx,yy);
  85.    inc(t1,step);
  86.    until t1=0;  {this is why nSteps must be even power of 2}
  87.   inc(color);
  88.   end;
  89.  end;
  90.  
  91.  
  92. {find 1/nth point in BSpline}  {this is what does the B-Spline work}
  93.  
  94. procedure moveTowards(d1,d2,d3,d4:coord;t1:word;var mov:coord);
  95.  const nsa=$10000 div 6; nsb=$20000 div 3;
  96.  var t2,t3:word;
  97.  var c1,c2,c3,c4:word;
  98. begin
  99.  t2:=fracMul(t1,t1); t3:=fracMul(t2,t1);
  100.  c1:=(integer(t2-t1)div 2)+nsa-fracmul(nsa,t3);
  101.  c2:=(t3 shr 1)+nsb-t2;
  102.  c3:=((t2+t1-t3)shr 1)+nsa;
  103.  c4:=fracmul(nsa,t3);
  104.  mov.x:=(mul(c1,d1.x)+mul(c2,d2.x)+mul(c3,d3.x)+mul(c4,d4.x))shr 16;
  105.  mov.y:=(mul(c1,d1.y)+mul(c2,d2.y)+mul(c3,d3.y)+mul(c4,d4.y))shr 16;
  106.  end;
  107.  
  108. var src,spd,dst,mov1,mov2:coord;
  109. var i:integer;
  110. begin
  111.  asm mov ax,$13; int $10; end;  {init vga/mcga graphics}
  112.  mouse.init;
  113.  mouse.show(true);
  114.  src.x:=5; src.y:=5;
  115.  spd.x:=5; spd.y:=5;
  116.  dst.x:=315; dst.y:=190;
  117.  repeat
  118. { for i:=0 to 23 do begin}
  119. {  color:=i+32;}
  120. {  inc(dst.x,i);}
  121.   delay(10);
  122.   mouse.check;  {this loads Mouse.X, Mouse.Y, Mouse.Button from driver}
  123.   mouse.show(false);
  124.   color:=15;
  125.   plot(src.x,src.y);
  126.   color:=14;plot(spd.x,spd.y);
  127.   dst.x:=mouse.x shr 1; dst.y:=mouse.y;
  128.   color:=1;plot(dst.x,dst.y);
  129.   mouse.show(true);
  130.  
  131. {the parameters in these next two lines can be changed}
  132. {I have played with almost all possible combinations and}
  133. {most work, but not well, so don't be afraid to play around}
  134. {But I think an entirely different approach is needed for the}
  135. { second moveTowards..}
  136.  
  137.   moveTowards(src,src,spd,dst,$0010,mov1);
  138.   moveTowards(src,spd,dst,dst,$5000,mov2); src:=mov1;
  139.   longint(spd):=(longint(spd)*7+longint(mov2))shr 3 and $1FFF1FFF;
  140.   until mouse.button;
  141.  mouse.show(false);
  142.  asm mov ax,3; int $10; end; {text mode again}
  143.  end.